/// 定义 UI 组件公共行为的特征：任何实现者都能被“绘制”。
pub trait Draw {
    /// 绘制当前组件；示例中以打印代替真正渲染。
    fn draw(&self);
}

// === 以下为基础类型实现，便于展示特征对象的灵活性 ===

impl Draw for u8 {
    fn draw(&self) {
        println!("draw u8: {}", self);
    }
}

impl Draw for f64 {
    fn draw(&self) {
        println!("draw f64: {:.2}", self);
    }
}

/// 接收 Box<dyn Draw> 的函数，展示特征对象 + 所有权传递。
pub fn draw_boxed(x: Box<dyn Draw>) {
    // Box 自动实现 Deref，调用实际类型的 draw 方法。
    x.draw();
    // Box<dyn Draw> 离开作用域后释放堆内存。
}

/// 接收 &dyn Draw 的函数，展示特征对象的借用形式。
pub fn draw_borrowed(x: &dyn Draw) {
    // 借用仅提供只读访问，无需关心底层具体类型。
    x.draw();
}